/*
 * Copyright (C) 2010 恒康信息科技有限公司
 * 版权所有
 */
package com.jjmmbb.stockdiary;

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.preference.PreferenceManager;

public class Util {

	/*
	 * px：像素。 in：英寸。 mm：毫米。 pt：磅。 dp：与密度无关的像素，基于160dpi（每英寸的像素数）屏幕（尺寸适应屏幕密度）。
	 * sp：与比例无关的像素（这种尺寸支持用户调整大小，适合在字体中使用）。
	 */

	/**
	 * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
	 */
	public static int dip2px(Context context, float dpValue) {
		final float scale = context.getResources().getDisplayMetrics().density;
		return (int) (dpValue * scale + 0.5f);
	}

	/**
	 * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
	 */
	public static int px2dip(Context context, float pxValue) {
		final float scale = context.getResources().getDisplayMetrics().density;
		return (int) (pxValue / scale + 0.5f);
	}

	/**
	 * 获取当前时间, 返回格式"yyyy-MM-dd HH:mm:ss"
	 * 
	 * @return
	 */
	public static String getFormateTime() {
		return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
	}

	/**
	 * 根据时间的毫秒数获取时间字符串, 返回格式"yyyy-MM-dd HH:mm"
	 * 
	 * @return
	 */
	public static String getFormateTime(Long milliseconds) {
		return new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date(
				milliseconds));
	}

	/**
	 * 根据时间的毫秒数获取时间字符串, 返回格式"yyyy-MM-dd"
	 * 
	 * @return
	 */
	public static String getFormateDate(Long milliseconds) {
		return new SimpleDateFormat("yyyy-MM-dd")
				.format(new Date(milliseconds));
	}

	/**
	 * 根据时间的毫秒数获取时间字符串, 返回格式"HH:mm"
	 * 
	 * @return
	 */
	public static String getFormateHour(Long milliseconds) {
		return new SimpleDateFormat("HH:mm").format(new Date(milliseconds));
	}

	/**
	 * 检查字符串是否是空对象或空字符串
	 * 
	 * @param str
	 * @return
	 */
	public static boolean isNull(String str) {
		if (null == str || "".equals(str) || "null".equalsIgnoreCase(str)) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 检测网络连接是否可用
	 * 
	 * @param ctx
	 * @return true 可用; false 不可用
	 */
	public static boolean isNetworkAvailable(Context ctx) {
		ConnectivityManager cm = (ConnectivityManager) ctx
				.getSystemService(Context.CONNECTIVITY_SERVICE);
		if (cm == null) {
			return false;
		}
		NetworkInfo activeNetInfo = cm.getActiveNetworkInfo();
		if (activeNetInfo != null) {
			if (activeNetInfo.isAvailable()) {
				return true;
			} else {
				return false;
			}
		}
		return false;
	}

	// 二进制开关标记算法_生成标记算法:
	// 用二进制标记当前是否显示;1表示显示,0表示不显示
	// 例如,标记的是星期一至星期日 那几天有闹钟提醒
	// 例如,传入3 1 得到 10
	public static int MarkCodeByBinary(ArrayList<Integer> list) {
		int sum = 0;
		for (int i : list) {
			sum += (int) Math.pow(2, i);
		}
		return sum;
	}

	// 二进制开关标记算法_解码标记算法:
	// 用二进制标记当前是否显示;1表示显示,0表示不显示
	// 例如标记的是星期一至星期日 那几天有闹钟提醒
	// 例如,传入 8 得到 3 表示星期3才提醒
	// 例如,传入 10 得到 3 1 表示星期1 和星期3 才提醒
	public static ArrayList<Integer> MarkDecodeByBinary(int num) {
		int mi = num;
		ArrayList<Integer> list = new ArrayList<Integer>();
		while (num >= 1) {
			mi = (int) (Math.log(num) / Math.log(2));
			num = (int) (num - Math.pow(2, mi));
			System.out.println(mi);// 输出
			list.add(mi);
		}
		return list;
	}

	// ----------------------------------以下是本程序特有的方法------------------//
	// 金钱格式化
	public static String mf(double money) {
		DecimalFormat df = new DecimalFormat("0.00");
		return df.format(money);
	}

	// ----------------------------------偏好读取------------------//

	/**
	 * 获取系统配置
	 */
	public static void getPreferences(Activity activity) {
		SharedPreferences settings = PreferenceManager
				.getDefaultSharedPreferences(activity);
		Comm.hide_finish = settings.getBoolean("hide_finish", Comm.hide_finish);
		Comm.hide_delete = settings.getBoolean("hide_delete", Comm.hide_delete);
		Comm.hide_team = settings.getBoolean("hide_team", Comm.hide_team);
		Comm.team_list = settings.getString("team_list", activity
				.getResources().getString(R.string.teamEdit_list));
	}

	/**
	 * 获取系统配置
	 */
	public static int getPreferenceAlarmId(Activity activity) {
		SharedPreferences settings = PreferenceManager
				.getDefaultSharedPreferences(activity);
		return settings.getInt("AlarmItemId", 0);
	}

	// 手动保存的代码
	public static void saveUser2Preferences(Activity activity) {
		SharedPreferences settings = PreferenceManager
				.getDefaultSharedPreferences(activity);
		SharedPreferences.Editor editor = settings.edit(); // 取得编辑对象
		editor.putString("team_list", Comm.team_list);// 添加值
		editor.commit();// 提交保存
	}

	// 手动保存的代码
	public static void saveOption2Preferences(Activity activity) {
		SharedPreferences settings = PreferenceManager
				.getDefaultSharedPreferences(activity);
		SharedPreferences.Editor editor = settings.edit(); // 取得编辑对象
		editor.putBoolean("hide_finish", Comm.hide_finish);// 添加值
		editor.putBoolean("hide_team", Comm.hide_team);// 添加值
		editor.commit();// 提交保存
	}

	// 保存提醒配置
	public static void saveAlarmList2Preferences(Context c, String jsonStr) {
		SharedPreferences settings = PreferenceManager
				.getDefaultSharedPreferences(c);
		SharedPreferences.Editor editor = settings.edit(); // 取得编辑对象
		editor.putString("AlarmList", jsonStr);// 添加值
		editor.commit();// 提交保存
	}

	// 启动服务
	public static void startServer(Context c) {
		// 更新配置文件
		// ItemManager im = new ItemManager(c);
		// Long now = new Date().getTime();
		// String sql = "select * from " + ItemDao.tableName
		// + " where type=0 and timeAlarm>" + now
		// + " order by timeAlarm desc";
		// ArrayList<Item> list = im.getListAsSQL(sql);// 获取需要提醒的记事项
		//
		// String title = "";
		// JSONObject obj = new JSONObject();
		// for (Item item : list) {
		// try {
		// title = item.title;
		// if (title.length() > 20) {
		// title = item.title.substring(0, 19) + "...";
		// }
		// obj.put(title, item.timeAlarm);
		// } catch (JSONException e) {
		// e.printStackTrace();
		// }
		// System.out.println(item.title + "  " + item.timeAlarm);
		// }
		// System.out.println(obj.toString());
		// saveAlarmList2Preferences(c, obj.toString());// 保存提醒配置

		// 启动服务
		Intent intent = new Intent();
		intent.setClass(c, DoListService.class);
		c.startService(intent);
	}

	// 查看文本是否包含电话,邮件,网址
	public static boolean canAutoLink(String str) {

		// 电话
		Pattern p1 = Pattern.compile("\\d{7,15}");
		// 邮件
		Pattern p2 = Pattern
				.compile("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*");
		// 网址
		Pattern p3 = Pattern.compile("[a-zA-z]+://[^\\s]*");

		Matcher m1 = p1.matcher(str);
		Matcher m2 = p2.matcher(str);
		Matcher m3 = p3.matcher(str);

		if (m1.find() || m2.find() || m3.find()) {
			return true;
		}
		return false;
	}

}
